package P1;

import java.util.Random;

public class Thermostat {
    // 定义恒温水箱的状态
    enum State {
        WAITING,     // 等待状态（20°C以上）
        HEATING,     // 加热中状态（温度低于20°C且有水）
        REPAIR,      // 维修状态（温度达到100°C）
        PREPARING,   // 烧水准备状态（温度低于20°C但无水）
        SLEEPING     // 休眠状态（晚上11点到早上7点）
    }

    private State currentState;

    double temperature = 18.0; //水温
    int time = 6;  //时间
    boolean isNightTime = false;
    private Random random = new Random();

    public Thermostat() {
        currentState = State.WAITING; // 初始状态为等待状态
    }


    public void timer() {   //时间计时器
        //随机加上时间
        int currenTime = this.time + random.nextInt(2) + 1;
        if (currenTime >= 7 && currenTime < 23) {
            this.isNightTime = false;
        } else {
            this.isNightTime = true;
        }
        this.time = currenTime % 24;
    }

    public void heating() {  //加热
        temperature = temperature + random.nextInt(20) + 10;  //10-30
    }

    public void coding() {  //冷却
        temperature = temperature - (random.nextInt(20) + 10);  //10-30
        if (temperature < 100) {
            temperature = 0;
        }
    }

    // 更新状态
    public void updateState(Boolean isWaterAvailable) {
        switch (currentState) {
            case WAITING:
                if (temperature < 20 && isWaterAvailable) {
                    currentState = State.HEATING;
                    // 打开继电器电源，开始烧水
                    System.out.println("打开继电器电源，开始烧水");
                }
                timer();
                coding();
                break;
            case HEATING:
                heating();
                timer();  //计时
                if (isNightTime) {
                    //进入休眠状态
                    currentState = State.SLEEPING;
                } else if (temperature >= 100) {
                    if (random.nextInt(11) == 10) {
                        currentState = State.REPAIR;
                        // 停止加热，进入维修状态
                        System.out.println("打开继电器电源，开始烧水");
                    } else {
                        currentState = State.WAITING;
                        System.out.println("断开继电器电源，等待冷却");
                    }
                } else if (!isWaterAvailable) {
                    currentState = State.PREPARING;
                    // 没有水，进入烧水准备状态
                    System.out.println("没有水，进入烧水准备状态");
                } else {
                    System.out.println("继续加热");
                }

                break;
            case REPAIR:
                // 在维修状态执行维修操作
                // 维修完成后，可以将状态转回到等待状态
                System.out.println("维修完成后，可以将状态转回到等待状态");
                currentState = State.PREPARING;
                timer();
                coding();
                break;
            case PREPARING:
                if (temperature <= 20 && isWaterAvailable) {
                    currentState = State.WAITING;
                    // 温度已经达到20°C，等待状态
                }
                break;
            case SLEEPING:
                if (!isNightTime) {
                    currentState = State.PREPARING;
                    // 早上7点，进入烧水准备状态
                    System.out.println("早上7点，进入烧水准备状态");
                }
                timer();
                coding();
                break;
        }
    }

    public static void main(String[] args) {
        Thermostat thermostat = new Thermostat();
        // 模拟状态机的行为
        for (int i = 0; i < 100; i++) {
            thermostat.updateState(true);
            System.out.println("等待。。。。");
        }
    }
}
